home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / News / Alexandra.0.82 / Source / MainWindowControl.m < prev    next >
Encoding:
Text File  |  1996-01-30  |  7.5 KB  |  338 lines

  1. #import "Alexandra.h"
  2. #import "MainWindowControl.h"
  3. #import "NewsgroupSetMatrix.h"
  4. #import "NewsgroupSet.h"
  5. #import "Newsgroup.h"
  6. #import "SideSplitView.h"
  7. #import "NntpPanelControl.h"
  8. #import "ArticleViewControl.h"
  9. #import "Decoding.subproj/DecoderController.h"
  10. #import "NNTP.h"
  11. #import "KillFile.h"
  12. #include <math.h>
  13. #import <misckit/MiscAppDefaults.h>
  14. #import "descriptors.h"
  15. #import "KeyEventResponder.h"
  16.  
  17. @implementation MainWindowControl
  18.  
  19. - free
  20. {
  21.    [otherNGView free];
  22.    [theNGSet dumpNewsrc:self];
  23.    [[mainWindow close] free];
  24.    [offscreenWindow free];
  25.    [theNGSet free];
  26.    [theArticleSet free];
  27.    [nntpServer free];
  28.    [theArticleViewControl free];
  29.    [killFile free];
  30.  
  31.    return [super free];
  32. }
  33.  
  34. - (BOOL) connectNNTP:(const char *)servername slowLink:(BOOL)slow
  35. {
  36.    char buf1[100],buf2[100];
  37.    const char *sideSplitViewW;
  38.    const char *splitViewH;
  39.    id keyHandler;
  40.  
  41.    [nntpServer init];
  42.    [nntpServer setSlowLink:slow];
  43.    if([nntpServer openServerNamed:servername]==nil)
  44.       return FALSE;
  45.    
  46.    [killFile setPath];
  47.    [postButton setEnabled:[nntpServer canPost]];
  48.    if(![nntpServer canPost])
  49.            {
  50.         [postButton setTitle:[postButton altTitle]];
  51.         [postButton setIcon:[postButton altIcon]];
  52.         }
  53.         
  54.    EM_DURING
  55.     
  56.     [theNGSet scanNewsrcAndActive];
  57.     
  58.     EM_HANDLER
  59.         if([EMLocalException exceptionClass]==EMClassNNTPErrors)
  60.             NX_VALRETURN(FALSE);
  61.         NX_RERAISE();
  62.    
  63.     EM_ENDHANDLER
  64.     
  65.    sprintf(buf1,"SideSplitView %s",servername);
  66.    sprintf(buf2,"SplitView %s",servername);
  67.    sideSplitViewW=[NXApp defaultValue:buf1];
  68.    splitViewH=[NXApp defaultValue:buf2];
  69.    if(sideSplitViewW!=NULL){
  70.       NXRect theRect;
  71.  
  72.       [upperPartLeft getFrame:&theRect];
  73.       [upperPartLeft sizeTo:atof(sideSplitViewW) :NX_HEIGHT(&theRect)];
  74.    }
  75.    if(splitViewH!=NULL){
  76.       NXRect theRect;
  77.       int uheight,lheight;
  78.       
  79.       sscanf(splitViewH,"%d %d",&uheight,&lheight);
  80.       [sideSplitView getFrame:&theRect];
  81.       [sideSplitView sizeTo:(NX_WIDTH(&theRect)) :(NXCoord)(uheight+4)];
  82.       [articleView getFrame:&theRect];
  83.       [articleView sizeTo:(NX_WIDTH(&theRect)) :(NXCoord)(lheight+4)];
  84.    }
  85.  
  86.    [sideSplitView setLeftView:upperPartLeft];
  87.    [sideSplitView setRightView:upperPartRight];
  88.    [sideSplitView initViews];
  89.  
  90.    [splitView addSubview:sideSplitView];
  91.    [splitView addSubview:articleView];
  92.    [splitView adjustSubviews];
  93.  
  94.    [[theArticleViewControl theText] setDelegate:theArticleViewControl];
  95.    [theNGSetMatrix setMatrixCellList:[theNGSet matrixList]];
  96.    [theNGSetMatrix loadMatrix];
  97.    [otherNGView setMatrixCellList:[theNGSet matrixList]];
  98.    [mainWindow setTitle:servername];
  99.    [mainWindow setFrameAutosaveName:servername];
  100.    [mainWindow setFrameUsingName:servername];
  101.    [mainWindow makeFirstResponder:theNGSetMatrix];
  102.  
  103.    keyHandler=[[KeyEventResponder alloc] init];
  104.    [keyHandler setNextResponder:[splitView nextResponder]];
  105.    [splitView setNextResponder:keyHandler];
  106.    [keyHandler setNGSet:theNGSet];
  107.    [keyHandler setArticleSet:theArticleSet];
  108.    
  109.    sprintf(buf1,"BrowserViewEnabled %s",servername);
  110.    if([NXApp defaultBoolValue:buf1])
  111.       [theNGSet switchToBrowserView:self];
  112.         
  113.    [mainWindow display];
  114.    [mainWindow makeKeyAndOrderFront:self];
  115.  
  116.    return TRUE;
  117. }
  118.  
  119. - disconnectAndClose:sender;
  120. {
  121.     return [mainWindow performClose:sender];
  122. }
  123.  
  124.  
  125. - nntpServer
  126. {
  127.    return nntpServer;
  128. }
  129.  
  130. - killFile
  131. {
  132.    return killFile;
  133. }
  134.  
  135. - articleText
  136. {
  137.    return [theArticleViewControl theText];
  138. }
  139.  
  140. - newsgroupMatrix
  141. {
  142.    return [theNGSet theMatrix];
  143. }
  144.  
  145. - articleMatrix
  146. {
  147.    return [theArticleSet theMatrix];
  148. }
  149.  
  150. - articleViewControll
  151. {
  152.    return theArticleViewControl;
  153. }
  154.  
  155. - newsgroupSet
  156. {
  157.    return theNGSet;
  158. }
  159.  
  160. - articleSet
  161. {
  162.    return theArticleSet;
  163. }
  164.  
  165. - (BOOL)articleSelected
  166. {
  167.    return ([theArticleSet numSelCells]==1);
  168. }
  169.  
  170. - (BOOL)articlesSelected
  171. {
  172.    return ([theArticleSet numSelCells]>0);
  173. }
  174.  
  175. - (BOOL)newsgroupSelected
  176. {
  177.    return ([theNGSet numSelCells]==1);
  178. }
  179.  
  180. - (BOOL)newsgroupsSelected
  181. {
  182.    return ([theNGSet numSelCells]>0);
  183. }
  184.  
  185. - printText:sender
  186. {
  187.    [theArticleViewControl printText:sender];
  188.    return self;
  189. }
  190.  
  191. - uudecode:sender
  192. {
  193.     if ([self articlesSelected]) {
  194.         // Lazily load the decoder controller.
  195.         if (decoderController == nil) { 
  196.             decoderController = [ [DecoderController alloc] init];
  197.         }
  198.  
  199.         // Begin the uudecoding, and pass self since the uudecoder needs
  200.         // access to the article list, etc.
  201.         [decoderController doDecoding:self];
  202.     }
  203.     else {
  204.         NXBeep();
  205.     }
  206.     return self;
  207. }
  208.  
  209. - forward:(SEL)aSelector :(marg_list)argFrame
  210. {
  211.    if([theArticleSet respondsTo:aSelector])
  212.       return [theArticleSet performv:aSelector :argFrame];
  213.    if([theNGSet respondsTo:aSelector])
  214.       return [theNGSet performv:aSelector :argFrame];
  215.    if([theArticleViewControl respondsTo:aSelector])
  216.       return [theArticleViewControl performv:aSelector :argFrame];
  217.    if([killFile respondsTo:aSelector])
  218.       return [killFile performv:aSelector :argFrame];
  219.  
  220.    [self doesNotRecognize:aSelector];
  221.    return self;
  222. }
  223.  
  224. - (BOOL)respondsTo:(SEL)aSelector
  225. {
  226.    if([theArticleSet respondsTo:aSelector])
  227.       return TRUE; 
  228.    if([theNGSet respondsTo:aSelector])
  229.       return TRUE;
  230.    if([theArticleViewControl respondsTo:aSelector])
  231.       return TRUE;
  232.    if([killFile respondsTo:aSelector])
  233.       return TRUE;
  234.  
  235.    return [super respondsTo:aSelector];
  236. }
  237.  
  238. - sideSplitViewDidResizeSubviews:sender
  239. {
  240.    char buf1[80];
  241.    char buf2[80];
  242.    NXRect frameRect;
  243.  
  244.    [upperPartLeft getFrame:&frameRect];
  245.  
  246.    sprintf(buf1,"SideSplitView %s",[nntpServer serverName]);
  247.    sprintf(buf2,"%d",(int)floor(NX_WIDTH(&frameRect)));
  248.    [NXApp setDefault:buf1 to:buf2];
  249.  
  250.    return self;
  251. }
  252.  
  253. - splitViewDidResizeSubviews:sender
  254. {
  255.    NXRect frameRect1,frameRect2;
  256.    char buf1[80],buf2[80];
  257.  
  258.    [sideSplitView getFrame:&frameRect1];
  259.    [articleView getFrame:&frameRect2];
  260.  
  261.    sprintf(buf1,"SplitView %s",[nntpServer serverName]);
  262.    sprintf(buf2,"%d %d", (int)floor(NX_HEIGHT(&frameRect1)), (int)floor(NX_HEIGHT(&frameRect2)));
  263.  
  264.    [NXApp setDefault:buf1 to:buf2];
  265.  
  266.    return self;
  267. }
  268.  
  269. - windowWillMiniaturize:sender toMiniwindow:miniwindow
  270. {
  271.    [sender setMiniwindowIcon:"app"];
  272.    return self;
  273. }
  274.  
  275. - (BOOL)killAuthorEnabled
  276. {
  277.    if((![nntpServer usesNov])&&(![nntpServer doesPrefetchFrom]))
  278.       return FALSE;
  279.    return TRUE;
  280. }
  281.  
  282. - (BOOL)sortCellEnabled:menueCell
  283. {
  284.    BOOL answer=TRUE;
  285.    char buf1[255];
  286.    int sortType;
  287.    BOOL useNov=[nntpServer usesNov];
  288.  
  289.    sprintf(buf1,"SortType %s",[nntpServer serverName]);
  290.    sortType=[NXApp defaultIntValue:buf1];
  291.  
  292.    if(!useNov){
  293.       if((![nntpServer doesPrefetchDate])&&
  294.                       ([menueCell action]==@selector(sortArticlesByDate:)))
  295.          return FALSE;
  296.       if((![nntpServer doesPrefetchFrom])&&
  297.                       ([menueCell action]==@selector(sortArticlesByName:)))
  298.          return FALSE;
  299.    }
  300.  
  301.    switch(sortType){
  302.       case SORT_BY_NUMBER:
  303.          if([menueCell action]==@selector(sortArticlesByNumber:)) answer=FALSE;
  304.          break;
  305.       case SORT_BY_SUBJECT:
  306.          if([menueCell action]==@selector(sortArticlesBySubject:)) answer=FALSE;
  307.          break;
  308.       case SORT_BY_DATE:
  309.          if([menueCell action]==@selector(sortArticlesByDate:)) answer=FALSE;
  310.          break;
  311.       case SORT_BY_REAL_NAME:
  312.          if([menueCell action]==@selector(sortArticlesByName:)) answer=FALSE;
  313.          break;
  314.    }
  315.    return answer;
  316. }
  317.  
  318. - freeAndClose:sender
  319. {
  320.    [myOwner serverWillClose:self];
  321.    [self free];
  322.    
  323.    return self;
  324. }
  325.  
  326. - windowWillClose:sender
  327. {
  328.    int answer=NXRunAlertPanel("ALEXANDRA","Close connection to NNTP Server %s?",NULL, "Cancel",NULL,[nntpServer serverName]);
  329.    if(answer!=NX_ALERTALTERNATE){
  330.       [self freeAndClose:self];
  331.       return self;
  332.    }
  333.  
  334.    return nil;
  335. }
  336.  
  337. @end
  338.